给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。
数据范围: ,数组中每个元素都满足
要求:时间复杂度 ,空间复杂度
进阶:时间复杂度 ,空间复杂度
注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。
[5,2,3,1,4]
[1,2,3,4,5]
[5,1,6,2,5]
[1,2,5,5,6]
class Solution: def partition(self, arr, l, r) -> int: base = arr[l] pre = l cur = l + 1 while cur <= r: if arr[cur] < base: pre += 1 arr[pre], arr[cur] = arr[cur], arr[pre] cur += 1 arr[l], arr[pre] = arr[pre], arr[l] return pre def inner_sort(self, arr, l, r): if l >= r: return arr mid = self.partition(arr, l, r) self.inner_sort(arr, l, mid - 1) self.inner_sort(arr, mid + 1, r) return arr def MySort(self , arr: List[int]) -> List[int]: # write code here return self.inner_sort(arr, 0, len(arr) - 1)由于是递归调用,最终不能通过:
def inner_sort(self, arr, l, r): if l >= r: return arr tasks = [(l, r)] while tasks: s, e = tasks.pop(0) if s >= e: continue mid = self.partition(arr, s, e) tasks.append((s, mid - 1)) tasks.append((mid + 1, e)) return arr运行通过。
python递归排序,直接通过,冒泡超时 class Solution: def MySort(self , arr: List[int]) -> List[int]: # write code here l1 = [] if len(arr) > 0: for i in range(len(arr)): mins = min(arr) l1.append(mins) arr.remove(mins) self.MySort(arr) return l1
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # 将给定数组排序 # @param arr int整型一维数组 待排序的数组 # @return int整型一维数组 # class Solution: # 冒泡排序 # def MySort(self,arr): # for i in range(len(arr) - 1): # for j in range(len(arr) - 1 - i): # if arr[j] > arr[j + 1]: # arr[j],arr[j+1] = arr[j+1],arr[j] # return arr # 选择排序 # def MySort(self,arr): # for i in range(len(arr) - 1): # min_index = i # for j in range(i+1,len(arr)): # if arr[j] < arr[min_index]: # min_index = j # arr[i],arr[min_index] = arr[min_index],arr[i] # return arr # 插入排序 # def MySort(self,arr): # for i in range(1,len(arr)): # key = arr[i] # j = i - 1 # while j >= 0: # if arr[j] > key: # arr[j+1] = arr[j] # arr[j] = key # j -= 1 # return arr # 直接使用sorted排序 # def MySort(self , arr ): # # write code here # return sorted(arr)
``` python
class Solution:
def MySort(self , arr: List[int]) -> List[int]:
# write code here
# quick sort
if not arr or len(arr) == 1:
return arr
# self.quick_sort_v2(arr, 0, len(arr) - 1)
self.quick_sort(arr, 0, len(arr) - 1)
return arr
# 双指针, 把比p小的都放到左边 def quick_sort(self, arr, start, end): if end - start <= 0: return mid = int((start + end) / 2) arr[mid], arr[end] = arr[end], arr[mid] p = arr[end] i = start for j in range(start, end): if arr[j] < p: arr[i], arr[j] = arr[j], arr[i] i+=1 arr[i], arr[end] = arr[end], arr[i] self.quick_sort(arr, start, i - 1) self.quick_sort(arr, i + 1, end) return
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 将给定数组排序 # @param arr int整型一维数组 待排序的数组 # @return int整型一维数组 # class Solution: def MySort(self , arr: List[int]) -> List[int]: # write code here def selectSort(arr): #选择排序,175ms,5100KB k = len(arr) temp = -1 index = 0 while k > 0: for i in range(0,k): if arr[i] > temp: temp,index = arr[i],i i += 1 arr[k-1],arr[index] = arr[index],arr[k-1] return arr def bubbleSort(arr): #冒泡排序,186ms,5100KB k = len(arr) while k > 0: for i in range(0,k-1): if arr[i] > arr[i+1]: arr[i],arr[i+1] = arr[i+1],arr[i] i += 1 k -= 1 return arr def insertSort(arr): #插入排序,77ms,5048KB res = [arr[0]] for i in arr[1:]: lenr = len(res)-1 if i <= res[0]: res.insert(0,i) continue while lenr >= 0: if res[lenr] > i: lenr -= 1 else: res.insert(lenr+1,i) break return res def mergeSort(arr): #归并排序,53ms,5040KB if len(arr) < 2: return arr mid = (len(arr))//2 left = mergeSort(arr[:mid]) right = mergeSort(arr[mid:]) i = j =0 res = [] while i<len(left) and j<len(right): if left[i] <= right[j]: res.append(left[i]) i += 1 else: res.append(right[j]) j += 1 if i == len(left):return res + right[j:] else:return res + left[i:] def quickSort(arr): #快速排序,53ms,4984KB list_equal = [] if len(arr) < 2: return arr left,right = 0,len(arr)-1 mid = (left+right)//2 list_left = [] list_right = [] for i in arr: if i > arr[mid]: list_right.append(i) elif i == arr[mid]: list_equal.append(i) else:list_left.append(i) return quickSort(list_left) +list_equal+ quickSort(list_right) return bubbleSort(arr)
class Solution: def MySort(self , arr: List[int]) -> List[int]: # write code here #桶排序 45% 16% max_value=max(arr) rounds=0 while max_value>=10**rounds: rounds+=1 for i in range(rounds): buckets=[[] for _ in range(10)] for num in arr: location=int((num/10**i)%10) buckets[location].append(num) new=[] for b in range(10): for v in buckets[b]: new.append(v) arr=new return arr #希尔排序 #插入排序 超时 # for i in range(len(arr)): # while i>=1: # if arr[i]<arr[i-1]: # arr[i],arr[i-1]=arr[i-1],arr[i] # i-=1 # return arr #归并排序 成功 15% 20% # def sort_al(lists): # if len(lists)<=1: # return lists # n=len(lists)//2 # res=[] # left=sort_al(lists[0:n]) # right=sort_al(lists[n:]) # while len(left)>0 and len(right)>0: # if left[0]<right[0]: # res.append(left.pop(0)) # else: # res.append(right.pop(0)) # if len(left)>0: # res.extend(left) # else: # res.extend(right) # return res # return sort_al(arr) #冒泡排序 超时 # for i in range(len(arr)): # for j in range(len(arr)-i-1): # if arr[j]>arr[j+1]: # arr[j],arr[j+1]=arr[j+1],arr[j] # return arr # #选择排序超时 # for i in range(len(arr)): # for j in range(i+1,len(arr)): # if arr[i]>arr[j]: # arr[i],arr[j]=arr[j],arr[i] # return arr #快排超时 # def fast_sort(lists,i,j): # if i>j: # return lists # else: # povit=lists[i] # low=i # high=j # while i<j: # while i<j and lists[j]>povit: # j-=1 # lists[i],lists[j]=lists[j],lists[i] # while i<j and lists[i]<povit: # i+=1 # lists[i],lists[j]=lists[j],lists[i] # fast_sort(lists, low, i-1) # fast_sort(lists, i+1, high) # return lists # a=fast_sort(arr, 0, len(arr)-1) # return a
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 将给定数组排序 # @param arr int整型一维数组 待排序的数组 # @return int整型一维数组 # class Solution: def MySort(self , arr: List[int]) -> List[int]: # write code here # 开始使用了冒泡,自测通过,但是提交时的用例提示运行超时,就转了下数据类型 # n = len(arr) # for i in range(n): # for j in range(n-i-1): # if arr[j] > arr[j+1]: # arr[j], arr[j+1] = arr[j+1], arr[j] arr = list(arr) arr.sort() return arr
class Solution: def MySort(self , arr: List[int]) -> List[int]: # write code here def qs(arr): if len(arr)<=1: return arr else: return qs([a for a in arr[1:] if a<=arr[0]])+[arr[0]]+qs([a for a in arr[1:] if a>arr[0]]) res=qs(arr) return res
''' 原理:1. 选取一个元素作为基准值,习惯上选择第一个元素 2.将剩下的元素和基准值比较,小于基准值的放在基准值左边,大于基准值的放在基准值右边 3. 重复1,2步骤,一直到剩最后一个元素 ''' def quick_sort(data:list)->list: if data==[]: return data base = data[0] left = quick_sort([l for l in data[1:] if l<base]) right = quick_sort([r for r in data[1:] if r>=base]) return left+[base]+right ''' 代码解读: 1. 首先data列表传进来 2.递归结束条件,递归传进来的data为空,结束递归.意思是当取最后一个元素当做基准值之后, left=[],right=[],也就是base左边和右边都 没有元素了 3.选取基准值 4.基准值左边排序 5.基准值右边排序 6.返回left+[base]+right '''